package com.wolfeyes.common.utils.framework.spring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @title 大致思路：实现ApplicationContextAware接口的setApplicationContext(ApplicationContext context)方法，
 * @title 并保存ApplicationContext 对象。Spring初始化时，会通过该方法将ApplicationContext对象注入。
 * @title 参考常见问题FAQ文档：Spring bean 手工依赖注入 10行 
 * @core 核心级别  ❤❤❤❤❤
 * @description Spring框架下容器动态自动装配Bean的配置工具类
 * @projectName bootdo
 * @className ApplicationContextRegister.java
 * @author yanyl
 * @email 1991yanyl@163.com
 * @date 2019-01-20 11:09:58
 * @since 2019年01月20日下午5:37:39
 * @createTime 2019年01月20日 下午17:04:13
 * @version 1.0.0
 */
@Component
public class ApplicationContextRegister implements ApplicationContextAware {
	
	/**
	 * slf4j日志对象
	 */
    private static Logger logger = LoggerFactory.getLogger(ApplicationContextRegister.class);
    
    /**
     * Spring容器应用上下文环境
     */
    private static ApplicationContext applicationContext; 
    
    /**
     * @title 实现ApplicationContextAware接口的回调方法，并设置Spring容器应用上下文环境
     * @description 设置Spring容器应用上下文环境(注入方式加载)
     * @param applicationContext spring上下文
     * @author yanyl
     * @since 2018年07月12日上午11:37:39
     * @return void
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    	
    	// Spring容器初始化时，会通过该方法将ApplicationContext对象通过回调的方式去注入
        logger.debug(String.format(" Spring Initialized Autowired ApplicationContext registed %n --> %1$s", applicationContext));
        
        //注入Spring容器应用上下文环境-applicationContext
        ApplicationContextRegister.applicationContext = applicationContext;
    }

    /**
     * @description 获取Spring容器应用上下文环境-applicationContext
     * @param 暂无
     * @author yanyl
     * @since 2018年07月12日上午11:37:39
     * @return Spring容器应用上下文环境-applicationContext
     * @throws Exception 异常
     */
    public static ApplicationContext getApplicationContext() {
    	
        return applicationContext ;
    }

    /**
     * @description 获取Spring容器应用当中的对象
     * @param beanName 待获取对象Bean的名称name
     * @author yanyl
     * @since 2018年07月12日上午11:37:39
     * @return T 容器对象Bean
     * @throws BeansException 异常
     */
    public static Object getBean(String beanName) throws BeansException {
    	
        return applicationContext.getBean(beanName);
    }
    
    /**
     * @description 获取Spring容器应用当中的对象
     * @param beanClazz 待获取对象Bean的字节码
     * @author yanyl
     * @since 2018年07月12日上午11:37:39
     * @return T Spring容器当中的Bean对象 
     * @throws BeansException 异常
     */
    public static <T> T getBean(Class<T> beanClazz) throws BeansException {
    	
        return applicationContext.getBean(beanClazz);
    }
    
}


